﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using Microsoft.Xna.Framework;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestionEco;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using System.Drawing;
using System.IO;

namespace Ecosystème
{
    public static class Traitements
    {

        public static List<EtreVivant> laListeEcosysteme;
        public static Plateau lePlateau;
        public static int[] taille;
        private static Random rand = new Random();
        public static int nbTours;
        public static int tourCourant;
        public static int indexDeIndividusCourant;
        public static bool start;
        public static int[] tabValeur;

        public static DataGridView dgvA;
        public static DataGridView dgvV;


        public static void chargerVegetaux(DataGridView vegetaux)
        {
            dgvV = vegetaux;
            int i = 0;

            if (Convert.ToBoolean(dgvV.Rows[0].Cells["presentV"].Value) == true)
            {
                while (i < Convert.ToInt32(dgvV.Rows[0].Cells["nbrV"].Value))
                {
                    laListeEcosysteme.Add(new Cactus(true, 5, 10, 1, 6, 10, 2, 2, System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\cactus.png")));
                    i++;
                }
                i = 0;
            }

            if (Convert.ToBoolean(dgvV.Rows[1].Cells["presentV"].Value) == true)
            {
                while (i < Convert.ToInt32(dgvV.Rows[1].Cells["nbrV"].Value))
                {
                    laListeEcosysteme.Add(new Tulipe(true, 5, 10, 1, 6, 10, 2, 2, System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\tulipe.png")));
                    i++;
                }
                i = 0;
            }
        }

        public static void chargerAnimaux(DataGridView animaux)
        {
            dgvA = animaux;
            int i = 0;

            if (Convert.ToBoolean(dgvA.Rows[0].Cells["presentA"].Value) == true)
            {
                while (i < Convert.ToInt32(dgvA.Rows[0].Cells["nbrA"].Value))
                {
                    laListeEcosysteme.Add(new Chameau(true, 100, 5, 8, 2, 6, 7, 200, 20, 200, 20, 6, 20, 5, 2, System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\chameau.png")));
                    i++;
                }
                i = 0;
            }

            if (Convert.ToBoolean(dgvA.Rows[1].Cells["presentA"].Value) == true)
            {
                while (i < Convert.ToInt32(dgvA.Rows[1].Cells["nbrA"].Value))
                {
                    laListeEcosysteme.Add(new Chat(true, 100, 5, 8, 2, 6, 7, 200, 20, 200, 20, 6, 20, 5, 2, System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\chat.png")));
                    i++;
                }
                i = 0;
            }

            if (Convert.ToBoolean(dgvA.Rows[2].Cells["presentA"].Value) == true)
            {
                while (i < Convert.ToInt32(dgvA.Rows[2].Cells["nbrA"].Value))
                {
                    laListeEcosysteme.Add(new Chevre(true, 1, 5, 2, 2, 6, 7, 200, 20, 200, 20, 6, 20, 5, 2, System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\chevre.png")));
                    i++;
                }
                i = 0;
            }

            if (Convert.ToBoolean(dgvA.Rows[3].Cells["presentA"].Value) == true)
            {
                while (i < Convert.ToInt32(dgvA.Rows[3].Cells["nbrA"].Value))
                {
                    laListeEcosysteme.Add(new Chien(true, 100, 5, 8, 2, 6, 7, 200, 20, 200, 20, 6, 20, 5, 2, System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\chien.png")));
                    i++;
                }
                i = 0;
            }

            if (Convert.ToBoolean(dgvA.Rows[4].Cells["presentA"].Value) == true)
            {
                while (i < Convert.ToInt32(dgvA.Rows[4].Cells["nbrA"].Value))
                {
                    laListeEcosysteme.Add(new Loup(true, 100, 5, 8, 2, 6, 7, 200, 20, 200, 20, 6, 20, 5, 2, System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\loup.png")));
                    i++;
                }
                i = 0;
            }

            if (Convert.ToBoolean(dgvA.Rows[5].Cells["presentA"].Value) == true)
            {
                while (i < Convert.ToInt32(dgvA.Rows[5].Cells["nbrA"].Value))
                {
                    laListeEcosysteme.Add(new Pigeon(true, 100, 5, 8, 2, 6, 7, 200, 20, 200, 20, 6, 20, 5, 2, System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\EtreVivants\pigeon.png")));
                    i++;
                }
                i = 0;
            }
        }

        public static void initialisation(ContentManager leContent)
        {
            start = false;
            nbTours = 100;
            tourCourant = 0;
            laListeEcosysteme = new List<EtreVivant>();
            lePlateau = new Plateau();
            int i = 0;

            chargerAnimaux(dgvA);
            chargerVegetaux(dgvV);

            //Transformation des images en textures
            //Génération des terrains

            for (i = 0; i < taille[0]; i++)
            {
                lePlateau.LesCases.Add(new List<Case>());
                for (int j = 0; j < taille[1]; j++)
                {
                    switch (rand.Next(0, 5))
                    {
                        case 1:
                            lePlateau.LesCases[i].Add(new Case(System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\Mer.jpg"), "Mer"));
                            break;
                        case 2:
                            lePlateau.LesCases[i].Add(new Case(System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\Plaine.jpg"), "Plaine"));
                            break;
                        case 3:
                            lePlateau.LesCases[i].Add(new Case(System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\Foret.jpg"), "Foret"));
                            break;
                        case 4:
                            lePlateau.LesCases[i].Add(new Case(System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\Montagne.jpg"), "Montagne"));
                            break;
                        default:
                            lePlateau.LesCases[i].Add(new Case(System.Drawing.Image.FromFile(Application.StartupPath + @"\Content\Desert.jpg"), "Desert"));
                            break;
                    }
                }
            }

            //Association des etres vivants aux cases
            foreach (EtreVivant ev in laListeEcosysteme)
            {

                lePlateau.LesCases.ElementAt(rand.Next(0, taille[0] - 1)).ElementAt(rand.Next(0, taille[1] - 1)).ListEVCase.Add(ev);

            }

            indexDeIndividusCourant = 0;

        }

        public static void actionEtreVivant()
        {

            EtreVivant etreVivantEnCours = laListeEcosysteme.ElementAt(indexDeIndividusCourant);

            etreVivantEnCours.FaimActuelle -= etreVivantEnCours.CoeffFaim;
            if (etreVivantEnCours.VieActuelle <= 0)
            {
                tuerUnIndividus();
            }

            if ((etreVivantEnCours.SoifActuelle - etreVivantEnCours.CoeffSoif) <= 0)
            {
                etreVivantEnCours.SoifActuelle = 0;
                tuerUnIndividus();
            }
            else
            {
                etreVivantEnCours.SoifActuelle -= etreVivantEnCours.CoeffSoif;
            }



            if (etreVivantEnCours.GetType().BaseType.Name.ToString().Equals("Vegetal") == false)
            {
                deplacerUnIndividus();
            }
            etreVivantEnCours.retraitPoints(1);



            if (Convert.ToString(etreVivantEnCours.GetType().BaseType) == "GestionEco.Carnivore")
            {
                Case cas = etreVivantEnCours.CasePosition;
                foreach (EtreVivant ev in cas.ListEVCase)
                {
                    if (Convert.ToString(ev.GetType().BaseType) == "GestionEco.Herbivore")
                    {
                        Console.WriteLine(etreVivantEnCours.NomEtre + " attaque " + ev.NomEtre);
                        Herbivore herbi = (Herbivore)ev;
                        Carnivore carni = (Carnivore)etreVivantEnCours;
                        carni.seNourrir(herbi);
                        if (ev.VieActuelle <= 0)
                        {
                            nourrirUnIndividus();
                        }

                    }
                }
            }




            if (etreVivantEnCours.PointsActionActuels > 0)
            {
                //nourrirUnIndividus();
                etreVivantEnCours.retraitPoints(1);
            }

            if (etreVivantEnCours.PointsActionActuels > 0)
            {
                desaltererUnIndividus();
                etreVivantEnCours.retraitPoints(1);
            }

            etreVivantEnCours.vieillir();

            if (etreVivantEnCours.VieActuelle <= 0)
            {
                tuerUnIndividus();
            }

            etreVivantEnCours.affichageConsole();
            indexDeIndividusCourant++;
            if (indexDeIndividusCourant >= laListeEcosysteme.Count)
            {
                indexDeIndividusCourant = 0;
            }
        }


        public static void deplacerUnIndividus()
        {
            EtreVivant etreVivantEnCours = laListeEcosysteme.ElementAt(indexDeIndividusCourant);

            Case laCaseSource = etreVivantEnCours.CasePosition;

            Case laCaseCible;

            if ((((int)(laCaseSource.Position.X / (lePlateau.LesCases.ElementAt(0).ElementAt(0).TextureCase.Width))) + 1) >= lePlateau.LesCases.Count)
            {

                laCaseCible = lePlateau.LesCases.ElementAt(0).ElementAt((int)(laCaseSource.Position.Y / (lePlateau.LesCases.ElementAt(0).ElementAt(0).TextureCase.Height)));

            }
            else
            {
                laCaseCible = lePlateau.LesCases.ElementAt(((int)(laCaseSource.Position.X / (lePlateau.LesCases.ElementAt(0).ElementAt(0).TextureCase.Width))) + 1).ElementAt((int)(laCaseSource.Position.Y / (lePlateau.LesCases.ElementAt(0).ElementAt(0).TextureCase.Height)));
            }

            laCaseSource.ListEVCase.Remove(etreVivantEnCours);
            laCaseCible.ListEVCase.Add(etreVivantEnCours);
            Console.WriteLine(etreVivantEnCours.affichageConsole() + " : deplacement");
        }

        public static void nourrirUnIndividus()
        {
            EtreVivant etreVivantEnCours = laListeEcosysteme.ElementAt(indexDeIndividusCourant);

            Case caseIndividuCourant = etreVivantEnCours.CasePosition;
            foreach (EtreVivant ev in caseIndividuCourant.ListEVCase)
            {
                if ((ev.GetType() == etreVivantEnCours.GetType()))
                {
                    int faim = ev.FaimActuelle;
                    ev.nourrir(10);
                    Console.WriteLine("Etre vivant : " + ev.NomEtre + " nourris. Sa faim passe de :" + faim + " à " + ev.FaimActuelle);
                }
            }


            Console.WriteLine(etreVivantEnCours.affichageConsole() + " : nourris");
        }

        public static void desaltererUnIndividus()
        {
            EtreVivant etreVivantEnCours = laListeEcosysteme.ElementAt(indexDeIndividusCourant);
            Case laCaseSource = etreVivantEnCours.CasePosition;

            if (laCaseSource.Terrain.QteEauActuelle > 0)
            {
                //int aboire = laCaseSource.Terrain.QteEauActuelle;
                int aboire = 0;
                if (laCaseSource.Terrain.QteEauActuelle <= (etreVivantEnCours.SoifMax - etreVivantEnCours.SoifActuelle))
                {
                    aboire = laCaseSource.Terrain.QteEauActuelle;
                    laCaseSource.Terrain.QteEauActuelle = 0;

                }
                else
                {
                    laCaseSource.Terrain.QteEauActuelle -= (etreVivantEnCours.SoifMax - etreVivantEnCours.SoifActuelle);
                    aboire = etreVivantEnCours.SoifMax - etreVivantEnCours.SoifActuelle;
                }

                etreVivantEnCours.boire(aboire);

                Console.WriteLine(etreVivantEnCours.affichageConsole() + " : desaltere de :" + aboire + " eau");
            }
            else
            {
                if (etreVivantEnCours.SoifActuelle >= etreVivantEnCours.SoifMax)
                {
                    etreVivantEnCours.VieActuelle -= 15;
                }

                Console.WriteLine(etreVivantEnCours.affichageConsole() + " : plus deau sur le terrain, impossible de se desalterer");
            }


        }

        public static void tuerUnIndividus()
        {

            EtreVivant etreVivantEnCours = laListeEcosysteme.ElementAt(indexDeIndividusCourant);
            Case laCaseSource = etreVivantEnCours.CasePosition;
            laCaseSource.ListEVCase.Remove(etreVivantEnCours);
            laListeEcosysteme.Remove(etreVivantEnCours);
            Console.WriteLine(etreVivantEnCours.NomEtre + " : mort");
        }


    }
}
